//
//  HMStatusViewModel.swift
//  Weibo
//
//  Created by itteacher on 2017/7/26.
//  Copyright © 2017年 itteacher. All rights reserved.
//

import UIKit
import YYText

//  封装微博cell的业务逻辑数据处理，对应的cell视图
class HMStatusViewModel: NSObject {
    
    //  引用模型
    var status: HMStatus? {
        didSet {
            //  处理会员等级显示的图片
            handleMbrankImage(mbrank: status?.user?.mbrank ?? 0)
            //  处理认证类型等级图片
            handleVerifiedTypeImage(verifiedType: status?.user?.verified_type ?? -1)
            if let currentStatus = status {
                //  处理转发微博内容
                handleRetweetContent(status: currentStatus)
            }
            
            //  处理来源数据
            handleSourceContent(source: status?.source ?? "")
            //  处理原创微博富文本
            originalAttributedStr = handleAttributedString(text: status?.text ?? "", isOriginal: true)
        }
    }
    
    //  会员等级图片
    var mbrankImage: UIImage?
    //  认证类型等级图片
    var verifiedTypeImage: UIImage?
    //  转发微博内容
    var retweetContent: String?
    //  来源
    var sourceContent: String?
    //  原创微博富文本
    var originalAttributedStr: NSAttributedString?
    //  转发微博富文本
    var retweetAttributedStr: NSAttributedString?
    
    //  处理微博转成富文本
    private func handleAttributedString(text: String, isOriginal: Bool) -> NSAttributedString {
        //  把微博内容转成富文本
        let attributedStr = NSMutableAttributedString(string: text)
        //  使用正则匹配表情描述
        let matchResultArray = try! NSRegularExpression(pattern: "\\[\\w+\\]", options: []).matches(in: text, options: [], range: NSMakeRange(0, (text as NSString).length))
        //  默认原创微博字体大小
        var fontSize: CGFloat = 14
        //  默认原创微博显示的富文本的颜色
        var color = UIColor.darkGray
        if isOriginal == false {
            //  转发微博字体大小
            fontSize = 13
            //  转发微博显示的富文本的颜色
            color = UIColor.lightGray
        }
    
        //  遍历匹配结果,倒序替换
        for matchResult in matchResultArray.reversed() {
            //  表情描述的范围
            let chsRange = matchResult.range
            print(NSStringFromRange(chsRange))
            //  获取表情描述
            let chs = (text as NSString).substring(with: chsRange)
            //  根据表情描述获取表情模型
            if let emoticon = HMEmoticonTools.sharedTools.selectEmoticonWith(chs: chs) {
                //  获取图片对象
                let image = UIImage(named: emoticon.path!, in: HMEmoticonTools.sharedTools.emoticonBundle, compatibleWith: nil)!
                //  表情富文本
//                let emoticonAttributedStr = NSAttributedString.attributedStringWith(emoticon: emoticon, font: UIFont.systemFont(ofSize: fontSize))
                
                //  注意:图片转富文本需要使用YYText提供方法
                let emoticonAttributedStr = NSAttributedString.yy_attachmentString(withEmojiImage: image, fontSize: fontSize)!
                //  根据表情描述的范围替换表情富文本
                attributedStr.replaceCharacters(in: chsRange, with: emoticonAttributedStr)
            }
        }
        
        //  统一设置富文本字体大小
        attributedStr.addAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: fontSize), NSForegroundColorAttributeName: color], range: NSMakeRange(0, attributedStr.length))
        
        //  添加富文本文字高亮
        //  匹配转发
        addHighlightedAttributedString(pattern: "@[^:]+", attributedStr: attributedStr)
        //  匹配话题
        addHighlightedAttributedString(pattern: "#[^#]+#", attributedStr: attributedStr)
        //  匹配链接
        addHighlightedAttributedString(pattern: "http[s]?://[^\\s\\u4e00-\\u9fa5]+", attributedStr: attributedStr)
        
//        let highlitedMatchResultArray = try! NSRegularExpression(pattern: "@[^:]+", options: []).matches(in: attributedStr.string, options: [], range: NSMakeRange(0, (attributedStr.string as NSString).length))
//        
//        for highlitedMatchResult in highlitedMatchResultArray {
//            //  获取高亮文字范围
//            let highlightedRange = highlitedMatchResult.range
//            //  高亮文字颜色
//            let color = UIColor(red: 80 / 255, green: 125 / 255, blue: 215 / 255, alpha: 1)
//            //  设置指定范围的富文本的文字颜色
//            attributedStr.addAttribute(NSForegroundColorAttributeName, value: color, range: highlightedRange)
//            //  设置点击高亮背景色
//            let bgColor = UIColor(red: 177 / 255, green: 215 / 255, blue: 255 / 255, alpha: 1)
//            let textHighlited = YYTextHighlight()
//            //  创建边框设置填充颜色
//            let textBorder = YYTextBorder(fill: bgColor, cornerRadius: 3)
//            //  设置内容间距
//            textBorder.insets = UIEdgeInsets(top: 1, left: 0, bottom: 0, right: 0)
//            //  设置高亮的背景边框对象
//            textHighlited.setBackgroundBorder(textBorder)
//            attributedStr.yy_setTextHighlight(textHighlited, range: highlightedRange)
//        }
        
        return attributedStr
    }
    
    //  添加点击文字高亮
    private func addHighlightedAttributedString(pattern: String, attributedStr: NSMutableAttributedString) {
        
        let highlitedMatchResultArray = try! NSRegularExpression(pattern: pattern, options: []).matches(in: attributedStr.string, options: [], range: NSMakeRange(0, (attributedStr.string as NSString).length))
        
        for highlitedMatchResult in highlitedMatchResultArray {
            //  获取高亮文字范围
            let highlightedRange = highlitedMatchResult.range
            //  高亮文字颜色
            let color = UIColor(red: 80 / 255, green: 125 / 255, blue: 215 / 255, alpha: 1)
            //  设置指定范围的富文本的文字颜色
            attributedStr.addAttribute(NSForegroundColorAttributeName, value: color, range: highlightedRange)
            //  设置点击高亮背景色
            let bgColor = UIColor(red: 177 / 255, green: 215 / 255, blue: 255 / 255, alpha: 1)
            let textHighlited = YYTextHighlight()
            //  创建边框设置填充颜色
            let textBorder = YYTextBorder(fill: bgColor, cornerRadius: 3)
            //  设置内容间距
            textBorder.insets = UIEdgeInsets(top: 1, left: 0, bottom: 0, right: 0)
            //  设置高亮的背景边框对象
            textHighlited.setBackgroundBorder(textBorder)
            attributedStr.yy_setTextHighlight(textHighlited, range: highlightedRange)
        }
    
    }
    
    
    //  时间处理, 只读计算属性，每次取值发微博时间都和当前时间进行对比，格式化微博时间
    var timeContent: String? {
        //  1. 第一种方式可以使用DateFormatter,把时间字符串转成时间对象， 注意需要指定locale, 并且设置“en_US”
        //        let dt = DateFormatter()
        //        dt.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy"
        //        dt.locale = Locale(identifier: "en_US")
        //        dt.date(from: "时间字符串")
        //  2. 使用YYModel直接把时间字符串转成时间对象

        guard let createAt = status?.created_at else {
            return nil
        }
        let dt = DateFormatter()
        
        //  代码执行到此，时间对象一定有值
        if isThisYear(createAt: createAt) {
            //  是今年
            //  创建日历对象
            let calendar = Calendar.current
            //  是否是今天
            if calendar.isDateInToday(createAt) {
                //  今天
                //  获取时间差对应的秒数, 发微博时间距离当前时间差多少秒
                let timeInterval = abs(createAt.timeIntervalSinceNow)
                //  判断是否是1分钟之前
                if timeInterval < 60 {
                    return "刚刚"
                } else if timeInterval < 3600 {
                    //  判断是否是1小时之前的逻辑
                    let result = timeInterval / 60
                    return "\(Int(result))分钟前"
                } else {
                    //  其它时间
                    let result = timeInterval / 3600
                    return "\(Int(result))小时前"
                }
                
            } else if calendar.isDateInYesterday(createAt) {
                //  昨天
                dt.dateFormat = "昨天 HH:mm"
            } else {
                //  其它
                dt.dateFormat = "MM-dd HH:mm"
            }
        } else {
            //  不是今年
            dt.dateFormat = "yyyy-MM-dd HH:mm"
        }
        return dt.string(from: createAt)
    }
    
    //  根据发微博事件判断是否是今年
    private func isThisYear(createAt: Date) -> Bool {
        let dt = DateFormatter()
        //  年份的格式化
        dt.dateFormat = "yyyy"
        //  获取发微博时间年份
        let createAtYear = dt.string(from: createAt)
        //  获取今年时间年份
        let currentYear = dt.string(from: Date())
        return createAtYear == currentYear
    }
    
    
    
    
    //  处理来源内容
    private func handleSourceContent(source: String) {
        
        //  获取开始截取的范围,  获取介绍截取的范围
        if let startRange = source.range(of: "\">"), let endRange = source.range(of: "</"){
            //  获取开始截取的光标索引, upperBound表示在指定范围里面的最大的光标索引
            let startIndex = startRange.upperBound
            //  获取结束截取的光标索引，lowerBound表示在指定范围里面的最小的光标索引
            let endIndex = endRange.lowerBound
            //  根据范围截取指定的字符串
            let subStr = source.substring(with: startIndex..<endIndex)
            //  来源数据拼接
            sourceContent = "来自: " + subStr
        }
        
    }
    
    //  处理转发微博内容
    private func handleRetweetContent(status: HMStatus) {
        if let retweetStatus = status.retweeted_status  {
            //  有转发微博内容
            //  获取转发微博用户昵称
            if let screenName = retweetStatus.user?.screen_name, let text = retweetStatus.text {
                //  昵称和转发微博内容一定有值，进行字符串的拼接
                retweetContent = "@\(screenName): \(text)"
                //  处理转发微博对应的富文本
                retweetAttributedStr = handleAttributedString(text: retweetContent!, isOriginal: false)
            }
            
        }
        
        
    }
    
    
    //  处理认证类型等级图片 (verifiedType 数字对应的图片)
    private func handleVerifiedTypeImage(verifiedType: Int) {
        switch verifiedType {
        case 0:
            verifiedTypeImage = UIImage(named: "avatar_vip")
        case 2, 3, 5:
            verifiedTypeImage = UIImage(named: "avatar_enterprise_vip")
        case 220:
            verifiedTypeImage = UIImage(named: "avatar_grassroot")
        default:
            verifiedTypeImage = nil
        }
    }
    
    
    //  处理会员等级图片（mbrank 对应的图片）
    private func handleMbrankImage(mbrank: Int) {
        if mbrank >= 1 && mbrank <= 6 {
            mbrankImage = UIImage(named: "common_icon_membership_level\(mbrank)")
        } else {
            mbrankImage = nil
        }
    }
    
    
    
}
